package demo.aop.aspect;


import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

import java.util.List;

//切入点表达式
@Component
@Aspect
@Slf4j
public class DemoAspectPointcut {

    //完全不限制，所有类，所有方法都会成为连接点
    /*@Before("execution(* *..*(..))")
    public void cut1() {
        log.info("完全不限制，所有类，所有方法都会成为连接点");
    }*/

    //demo.aop.service包及子包
    @Before("execution(* demo.aop.service..*(..))")
    public void cut2() {
        log.info("demo.aop.service包及子包");
    }

    //demo.aop.service 包及子包中sava开头的方法
    @Before("execution(* demo.aop.service..save*(..))")
    public void cut3() {
        log.info("demo.aop.service 包及子包中sava开头的方法");
    }

    //demo.aop.service 包及子包中 不需要参数的方法  如save()方法
    @Before("execution(* demo.aop.service..*()) ")
    public void cut4() {
        log.info("demo.aop.service 包及子包中 不需要参数的方法");
    }

    //demo.aop.service 包及子包中参数列表为 (int,String) 的方法，如save(int age, String name)方法
    @Before("execution(* demo.aop.service..*(int,String)) ")
    public void cut5() {
        log.info("demo.aop.service 包及子包中参数列表为 (int,String) 的方法 ");
    }

    //限制方法参数时，如果参数是复杂类型参数，需要将这个类型写完整：java.util.List
    @Before("execution(* demo.aop.service..*(java.util.List)) ")
    public void cut6() {
        log.info("限制方法参数时，如果参数是复杂类型参数");
    }

    //表达式可以用 '&', '||' 和 '!'  做合并
    //包含  demo.aop.controller 下所有类的所有方法  且 不包含 demo.aop.controller.PassportController的所有方法
    @Before("execution(* demo.aop.controller..*(..)) " +
            " && !execution(* demo.aop.controller.PassportController.*(..))"
            + " || execution(* demo.aop.service..*(..))"
    )
    public void cut7() {
        log.info("所有controller包和所有service包下的类的所有方法，但排除demo.aop.controller.PassportController的所有方法");
    }


    //within 确切到类，所有controller包里所有的类的方法
    @Before("within(demo.aop.controller.*)")
    public void cut8() {
        log.info("所有controller包里所有的类的方法");
    }

    //within 确切到类，所有controller包，及子包 里所有的类的方法
    @Before("within(demo.aop.controller..*)")
    public void cut9() {
        log.info("within 确切到类，所有controller包，及子包 里所有的类的方法");
    }

    //within 确切到具体的类WithinTestController
    @Before("within(demo.aop.controller.WithinTestController)")
    public void cut10() {
        log.info("within 确切到具体的类WithinTestController");
    }


    //通过bean制定 spring容器中的名为beanTestController的bean
    //spring中的bean名字会默认小写首字母，或者显示的命名 @RestController("beanTestController")
    @Before("bean(beanTestController)")
    public void cut11() {
        log.info("通过bean制定 spring容器中的名为beanTestController的bean");
    }


}
